package Day008_List_Collections_set.Demo06_Set接口;

/*
    TreeSet集合是Set接口的一个实现类,底层依赖于TreeMap,是一种基于 红黑树 的实现,其特点为：
        1. 元素唯一
        2. 元素没有索引
        3. 使用元素的自然顺序对元素进行排序，或者根据创建 TreeSet 时提供的  Comparator 比较器 进行排序，具体取决于使用的构造方法：

    构造方法:
            public TreeSet()：创建集合对象,根据其元素的自然排序(默认规则)进行排序
                              默认排序规则,在集合元素所属的类(Integer类)中指定
                              集合元素所属的类通过实现Comparable比较器接口,重写接口中的compareTo方法,在该方法中指定默认排序规则
                          注意:
                              1.如果集合中的元素类型为自定义类型,那么该类就必须实现Comparable接口,重写接口中的compareTo方法,
                                确认默认规则

            public TreeSet(Comparator<E> comparator): 创建集合对象,根据指定的比较器进行排序
                //创建对象,指定规则,Comparator接口实现,匿名内部类
                TreeSet<Integer> set2 = new TreeSet<>(new Comparator<Integer>()
                通过Comparator接口实现规则
*/

import java.util.Comparator;
import java.util.TreeSet;

public class demo04_TreeSet {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Integer> set1 = new TreeSet<>();

        set1.add(300);
        set1.add(200);
        set1.add(100);
        set1.add(500);
        set1.add(400);
        set1.add(300);

        System.out.println(set1); // [100, 200, 300, 400, 500]  默认规则排序(升序),且元素唯一

        //指定排序规则
        TreeSet<Integer> set2 = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                 /*
                    前(第一个参数)减后(第二个参数) 升序
                    后(第二个参数)减前(第一个参数) 降序
                 */
                return o2 - o1;
            }
        });

        set2.add(300);
        set2.add(200);
        set2.add(100);
        set2.add(500);
        set2.add(400);
        set2.add(300);

        System.out.println(set2); //[500, 400, 300, 200, 100] 降序

    }
}
/**
 存入元素的时候，它创建了一个树，第一个元素就是树的根节点，后面的元素依次从树的根节点开始向后比较（创建比较器，利用comparator()方法进行比较），
 小的就往左边放，大的就往右边放，而相同的就不放进去（实现了唯一性）。(左小右大,不平衡就旋转)
 取出元素的时候，它采用前序遍历的方法（根节点 左子树 右子树）遍历整个树，达到有序

 如果一个类要想实现自然排序，就必须实现自然排序接口。因此我们在Student类上实现comparable接口并实现compareTo()方法，方法里面定义排序规则
 */